package com.moyu.blog.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.moyu.blog.dao.mapper.ArticleMapper;
import com.moyu.blog.dao.mapper.SysUserMapper;
import com.moyu.blog.dao.pojo.Article;
import com.moyu.blog.service.ArticleService;
import com.moyu.blog.service.SysUserService;
import com.moyu.blog.service.TagService;
import com.moyu.blog.vo.ArticleVo;
import com.moyu.blog.vo.Result;
import com.moyu.blog.vo.param.PageParam;
import org.joda.time.DateTime;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private ArticleMapper articleMapper;

    @Autowired
    private TagService tagService;

    @Autowired
    private SysUserService sysUserService;

    @Override
    public Result listArticle(PageParam pageParam) {
        /**
         * 分页查询 article 数据库表
         */
        //当前页，和每页查询数量存放到MyBatisPlus提供的Page实体中
        Page<Article> page = new Page<>(pageParam.getPage(),pageParam.getPageSize());

        //创建LambdaQueryWrapper对象，放查询条件
        LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<>();

        //weight是1的是置顶，这个的意思是先按是否置顶倒序排列，再按时间进行倒序排列
        queryWrapper.orderByDesc(Article::getWeight,Article::getCreateDate);

        //MyBatisPlus 提供的selectPage方法 参数：当前页和每页查询数量，查询条件
        Page<Article> articlePage = articleMapper.selectPage(page, queryWrapper);

        //得到数据的List，不能直接返回
        List<Article> records = articlePage.getRecords();

        //写了一个copyList方法进行了处理
        List<ArticleVo> articleVoList = copyList(records,true,true);

        return Result.success(articleVoList);
    }

    /**
     *把Article中的参数 copy 给ArticleVo（多条数据）
     * @param records
     * @return
     */
    private List<ArticleVo> copyList(List<Article> records,boolean isTag,boolean isAuthor) {
        List<ArticleVo> articleVoList = new ArrayList<>();
        //每条record都是Article类型，都使用单条数据转换
        for(Article record : records){
            articleVoList.add(copy(record,true,true));
        }
        return articleVoList;
    }


    /**
     * 把Article中的参数 copy 给ArticleVo（单条数据）
     * @param article
     * @return
     */
    private ArticleVo copy(Article article,boolean isTag,boolean isAuthor) {
        ArticleVo articleVo = new ArticleVo();

        //MyBatisPlus提供的copy属性的方法 参数：被复制的实体，复制出来的实体
        BeanUtils.copyProperties(article,articleVo);

        //创建时间在ArticleVo是String 在 Article是Long
        //转换一下格式
        articleVo.setCreateDate(new DateTime(article.getCreateDate()).toString("yyyy-MM-dd HH:mm"));

        //并不是所有的接口都需要标签，作者信息,需要的话再设置
        if(isTag){
            Long articleId = article.getId();
            //获取到所有的标签
            articleVo.setTags(tagService.findTagsByArticleId(articleId));
        }
        if(isAuthor){
            Long authorId = article.getAuthorId();
            //获取作者名
            articleVo.setAuthor(sysUserService.findUserById(authorId).getNickname());
        }


        return articleVo;
    }

}
